/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.business.beans;

import java.util.List;
import javax.ejb.Local;
import org.asportoonline.entities.Locale;
import org.asportoonline.entities.Prodotto;

/**
 *
 * @author fe
 */
@Local
public interface ProdottoManager {

    /**
     * Cerca tutti i Prodotti presenti nel database.
     * 
     * @return restituisce una lista contenente tutti i Prodotti presenti nel database; 
     * se non ce ne sono restituisce null.
     * @see Prodotto
     */
    List<Prodotto> elencoProdotti();

    /**
     * Inserisce un nuovo Prodotto, che deve avere un nome univoco per ogni Locale.
     * 
     * @param prodotto 
     * @see Prodotto
     */
    void inserisciProdotto(Prodotto prodotto);

    /**
     * Cerca un prodotto in base al nome e al locale a cui è associato.
     * 
     * @param nome_prodotto nome del prodotto
     * @param locale Locale a cui è associato il prodotto
     * @return restituisce il Prodotto, se esiste, altrimenti null.
     * @see Prodotto
     * @see Locale
     */
    Prodotto cercaProdottoDelLocale(String nome_prodotto, Locale locale);
    
    /**
     * Cerca tutti i Prodotti di un Locale.
     * 
     * @param locale Locale di cui si vogliono recuperare i prodotti
     * @return restituisce una lista contenente tutti i Prodotti del Locale locale;
     * se il locale non esiste o non ha nessun prodotto associato restituisce null.
     * @see Prodotto
     * @see Locale
     */
    List<Prodotto> cercaProdottiDelLocale(Locale locale);
    
    /**
     * Cerca un Prodotto in base all'ID.
     * 
     * @param id ID del prodotto.
     * @return se l'ID esiste restituisce il Prodotto, altrimenti restituisce null.
     * @see Prodotto
     */
    Prodotto cercaProdotto(long id);
    
    /**
     * Modifica un prodotto esistente.
     * 
     * @param p Prodotto da modificare 
     * @see Prodotto
     */
    void aggiornaProdotto(Prodotto p);
    
    /**
     * Cerca tutti i locali che offrono almeno un prodotto di una certa categoria.
     * 
     * @param nomeCategoria nome della categoria 
     * @return restituisce il numero dei locali trovati
     */
    int numeroLocaliConProdottiDellaCategoria(String nomeCategoria);
    
    /**
     * Cerca tutti i locali, di una certa localita, che offrono almeno un prodotto di una certa categoria.
     * 
     * @param nomeCategoria nome della categoria 
     * @return restituisce il numero dei locali trovati
     */
    int numeroLocaliDiUnaLocalitaConProdottiDellaCategoria(String nomeCategoria, String localita);
    
    /**
     * Cerca tutti i locali che offrono almeno un prodotto di una certa categoria.
     * 
     * @param nomeCategoria nome della categoria 
     * @return restituisce una lista contenente tutti i locali trovati; se non ne trova restituisce null
     * @see Locale
     */
    List<Locale> localiConProdottiDellaCategoria(String nomeCategoria);
    
    /**
     * Cerca tutti i locali, di una certa localita, che offrono almeno un prodotto di una certa categoria.
     * 
     * @param nomeCategoria nome della categoria 
     * @return restituisce una lista contenente tutti i locali trovati; se non ne trova restituisce null
     * @see Locale
     */
    List<Locale> localiDiUnaLocalitaConProdottiDellaCategoria(String nomeCategoria, String localita);
    
    /**
     * Cerca tutti i nomi delle categorie offerte dai locali di una certa localita.
     * 
     * @param localita  nome della localita
     * @return restituisce una lista contenente i nomi delle categorie offerte dai locali di una certa localita; se non ne trova restituisce null
     * @see Locale
     */
    public List<String> categorieDeiLocaliDiUnaLocalita(String localita);
    
}
